﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Text;
using Gma.QrCodeNet.Encoding;
using Gma.QrCodeNet.Encoding.Windows.Render;
using MessagingToolkit.QRCode.Codec;


namespace Tools {
    /// <summary>
    /// 二维码
    /// HomePage:http://qrcodenet.codeplex.com/
    /// TODO:中心生成图标
    /// </summary>
    public static class QrCodeHelper {
        /*********************************
         * 
         * Normal QrCode has version from 1 to 40. QrMatrix width is equal to 17 plus 4 times version number.
         * Version(1<=V<=40):Size=N*N;N=4*V+17=>N(2) modules
         * Ex: Version 7 width = 17 + 4 * 7 which is 45
         * 版本信息：即二维码的规格，QR码符号共有40种规格的矩阵（一般为黑白色），从21x21（版本1），到177x177（版本40），每一版本符号比前一版本 每边增加4个模块
         *简要的编码过程：
         *  1. 数据分析：确定编码的字符类型，按相应的字符集转换成符号字符； 选择纠错等级，在规格一定的条件下，纠错等级越高其真实数据的容量越小。
         *  2. 数据编码：将数据字符转换为位流，每8位一个码字，整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。
         */


        /// <summary>
        ///    生成二维码图片
        /// </summary>
        /// <param name="printWord">生成内容</param>
        /// <param name="fileName">生成的图片完整路径，本地路径+文件名</param>
        public static void Make(String printWord, String fileName) {
            Make(printWord, fileName, 3);
        }

        /// <summary>
        ///     生成二维码图片
        /// </summary>
        /// <param name="printWord">生成内容</param>
        /// <param name="fileName">生成的二维码完整路径，本地路径+文件名</param>
        /// <param name="moduleSize">二维码大小</param>
        public static void Make(String printWord, String fileName, Int32 moduleSize) {
            var encoder = new QrEncoder();
            QrCode qrCode;

            if (!encoder.TryEncode(printWord, out qrCode))
                return;

            /**************
             * QuietZoneModules.Four 空白边距
             * 3:版本号 决定了二维码尺寸大小
             */

            var gRender = new GraphicsRenderer(new FixedModuleSize(moduleSize, QuietZoneModules.Zero));
            using (var stream = new FileStream(fileName, FileMode.Create)) {
                gRender.WriteToStream(qrCode.Matrix, ImageFormat.Png, stream, new Point(600, 600));
            }
        }


        /// <summary>
        ///     生成带Logo的二维码
        /// </summary>
        /// <param name="logoUrl">logo可读取的本地地址</param>
        /// <param name="printContent">二维码内容</param>
        /// <param name="fileName">生成的二维码完整路径，本地路径+文件名</param>
        /// <param name="moduleSize">二维码大小</param>
        public static void MakewithLogo(String logoUrl, String printContent, String fileName, Int32 moduleSize) {

            var encoder = new QRCodeEncoder {
                QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.H,
                QRCodeScale = moduleSize
            };

            var qrCodeImg = encoder.Encode(printContent);

            System.Drawing.Image logo = System.Drawing.Image.FromFile(logoUrl);

            int left = (qrCodeImg.Width / 2) - (logo.Width / 2);
            int top = (qrCodeImg.Height / 2) - (logo.Height / 2);

            using (Graphics g = Graphics.FromImage(qrCodeImg)) {
                g.DrawImage(logo, new Point(left, top));
                qrCodeImg.Save(fileName, ImageFormat.Jpeg);
            }

        }

    }
}
